home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / etc / hotplug / tape.agent < prev    next >
Text File  |  2006-05-01  |  7KB  |  252 lines

  1. #!/bin/sh
  2. ###############################################################################
  3. # Tape hotplug agent for Linux 2.4 kernels
  4. #
  5. # Copyright (c) 2002 IBM Development Germany, Boeblingen
  6. #
  7. # the GNU Public License applies
  8. # Author: Stefan Bader <Stefan.Bader@de.ibm.com>, 2002
  9. #
  10. # History:
  11. #   2002-10-14 Stefan Bader <Stefan.Bader@de.ibm.com>
  12. #              Fixed remove char case (missing statement)
  13. #   2002-10-01 Stefan Bader <Stefan.Bader@de.ibm.com>
  14. #              Created inital version
  15. #
  16. # Generated by:
  17. #   /usr/src/linux/drivers/s390/char/tape.c
  18. #
  19. # Evionment:
  20. #   ACTION    ::= add | remove
  21. #   DEVNO     ::= <4 digit hex number>
  22. #   MAJOR     ::= <dec major number>
  23. #   MINOR     ::= <dec minor number>
  24. #   INTERFACE ::= char | block
  25. ###############################################################################
  26. : ${ACTION?Bad invocation: \$ACTION is not set}
  27. : ${DEVNO?Bad invocation: \$DEVNO is not set}
  28. : ${MAJOR?Bad invocation: \$MAJOR is not set}
  29. : ${MINOR?Bad invocation: \$MINOR is not set}
  30. : ${INTERFACE?Bad invocation: \$INTERFACE is not set}
  31.  
  32. # Convert to lowercase (just in case)
  33. DEVNO=$(echo $DEVNO | tr A-F a-f)
  34.  
  35. cd /etc/hotplug
  36. . hotplug.functions
  37.  
  38. mesg "$ACTION $DEVNO $MAJOR $MINOR $INTERFACE"
  39.  
  40. if test -r tape.permissions; then
  41.     . tape.permissions
  42. else
  43.     mesg "Tape permission handling not found"
  44.     exit 1
  45. fi
  46.  
  47. #==============================================================================
  48. # To preserve the script from doing anything real, call it with
  49. # CONDOM=echo
  50. : ${CONDOM=}
  51. # To try things on an alternate location set ROOTDIR to a different base
  52. #: ${ROOTDIR=}
  53. : ${ROOTDIR=}
  54. # Abort on error or unset variables:
  55. set -o errexit
  56. set -o nounset
  57. #==============================================================================
  58.  
  59. #------------------------------------------------------------------------------
  60. # Environment: none
  61. # Parameters : $1 : abort message
  62. #              $2 : optional return code
  63. #------------------------------------------------------------------------------
  64. # Abort handling
  65. abort() {
  66.     if test "$#" -lt 2; then
  67.         RC=1
  68.     else
  69.         RC=$2
  70.     fi
  71.  
  72.     mesg "$1 RC($RC)"
  73.     exit $RC
  74. }
  75.  
  76. #------------------------------------------------------------------------------
  77. # Environment: INTERFACE
  78. #              MINOR
  79. # Parameters:  none
  80. #
  81. # Prints:      Tape number [0..127]
  82. # Returns:     0
  83. #------------------------------------------------------------------------------
  84. tape_number() {
  85.     if test "$INTERFACE" = "block"; then
  86.         echo $MINOR
  87.     else
  88.         echo "$(($MINOR / 2))"
  89.     fi
  90.     return 0
  91. }
  92.  
  93. #------------------------------------------------------------------------------
  94. # Environment: ROOTDIR
  95. #              DEVNO
  96. #              CONDOM
  97. # Parameters:  $1 : variable part of the link name
  98. #              $2 : variable part of the target node name
  99. #
  100. # Creates a symbolic link to access the tape device by devno
  101. #
  102. # Prints:      nothing
  103. # Returns:     0 on success, otherwise 1
  104. #------------------------------------------------------------------------------
  105. create_symlink() {
  106.     LINK=$ROOTDIR/dev/tape/$DEVNO/$1
  107.     TARGET=../../../$2$(tape_number)
  108.  
  109.     # Do not create link if devfs compatibility mode is not started
  110.     if test ! -d $ROOTDIR/dev/tape; then
  111.         return 0
  112.     fi
  113.  
  114.     if test ! -d $(dirname $LINK); then
  115.         $CONDOM mkdir -p $(dirname $LINK)                  || return 1
  116.     fi
  117.     mesg "Creating symlink $LINK -> $TARGET"
  118.     $CONDOM rm -f $LINK                                        || return 1
  119.     $CONDOM ln -s $TARGET $LINK                                || return 1
  120.  
  121.     return 0
  122. }
  123.  
  124. #------------------------------------------------------------------------------
  125. # Environment: MAJOR
  126. #              MINOR
  127. # Parameters:  $1 : node name
  128. #              $2 : device type (b|c)
  129. #
  130. # Tests whether the node already exists with the correct type, major and minor
  131. #
  132. # Prints:      nothing
  133. # Returns:     0 if the node is ok, otherwise 1
  134. #------------------------------------------------------------------------------
  135. verify_node() {
  136.     NAME="$1"
  137.     TYPE="$2"
  138.     RC=1
  139.  
  140.     if test -$TYPE "$NAME"; then
  141.         MAJMIN=$(ls -l "$NAME"|awk '{print $5 $6}')
  142.  
  143.         if test "$(echo $MAJMIN|cut -d, -f1)" = "$MAJOR"; then
  144.             if test "$(echo $MAJMIN|cut -d, -f2)" = "$MINOR"; then
  145.                 RC=0
  146.             fi
  147.         fi
  148.     fi
  149.  
  150.     return $RC
  151. }
  152.  
  153. #------------------------------------------------------------------------------
  154. # Environment: ROOTDIR
  155. #              INTERFACE
  156. #              CONDOM
  157. #              MAJOR
  158. #              MINOR
  159. #              OWNER
  160. #              PERMISSIONS
  161. # Parameters:  $1 : device type (b|c)
  162. #              $2 : variable part of the device node name ([brn]tibm)
  163. #
  164. # Creates a device node for the tpae device (if it doesn't exist) and sets
  165. # the permissions.
  166. #
  167. # Prints:      nothing
  168. # Returns:     0 on success, otherwise 1
  169. #------------------------------------------------------------------------------
  170. create_node() {
  171.     TYPE="$1"
  172.     NAME="$ROOTDIR/dev/$2$(tape_number)"
  173.  
  174.     # FIXME: This would currently recreate the device node if it isn't
  175.     #        right even if devfs compatibility isn't enabled. Should
  176.     #        ownership and permissions be preserved in that case???
  177.     if ! verify_node $NAME $TYPE; then
  178.         mesg "Creating devicenode $NAME"
  179.         $CONDOM rm -f "$NAME"                              || return 1
  180.         $CONDOM mknod "$NAME" $TYPE $MAJOR $MINOR          || return 1
  181.     fi
  182.  
  183.     # We only want to change ownership and permissions if devfs compa-
  184.     # tibility is enabled.
  185.     tape_permissions $DEVNO
  186.     if test "$OWNER" != "" && test -d $ROOTDIR/dev/tape; then
  187.         $CONDOM chown $OWNER "$NAME"                       || return 1
  188.  
  189.         if test "$PERMISSIONS" != ""; then
  190.             $CONDOM chmod "$PERMISSIONS" "$NAME"       || return 1
  191.         fi
  192.     fi
  193.  
  194.     return 0
  195. }
  196.  
  197. #------------------------------------------------------------------------------
  198. # Main
  199. #------------------------------------------------------------------------------
  200. case "$ACTION" in
  201.     add)
  202.         case "$INTERFACE" in
  203.             block)
  204.                 create_node    b btibm             || return 1
  205.                 create_symlink block/disc btibm    || return 1
  206.                 ;;
  207.             char)
  208.                 create_node    c ntibm             || return 1
  209.                 create_symlink char/norewind ntibm || return 1
  210.                 MINOR=$(($MINOR + 1))
  211.                 create_node    c rtibm             || return 1
  212.                 create_symlink char/rewind rtibm   || return 1
  213.                 ;;
  214.             *)
  215.                 abort "Unknown interface type <$INTERFACE>"
  216.                 ;;
  217.         esac
  218.         ;;
  219.     remove)
  220.         case "$INTERFACE" in
  221.             char)
  222.                 $CONDOM rm -rf $ROOTDIR/dev/tape/$DEVNO/char
  223.                 if test -d $ROOTDIR/dev/tape; then
  224.                     $CONDOM rm -f \
  225.                     $ROOTDIR/dev/[nr]tibm$(tape_number)
  226.                 fi
  227.                 ;;
  228.             block)
  229.                 $CONDOM rm -rf $ROOTDIR/dev/tape/$DEVNO/block
  230.                 if test -d $ROOTDIR/dev/tape; then
  231.                     $CONDOM \
  232.                     rm -f $ROOTDIR/dev/btibm$(tape_number)
  233.                 fi
  234.                 ;;
  235.             *)
  236.                 abort "Unknown interface type <$INTERFACE>"
  237.                 ;;
  238.         esac
  239.  
  240.         if test "$(ls $ROOTDIR/dev/tape/$DEVNO)" = ""; then
  241.             $CONDOM rmdir $ROOTDIR/dev/tape/$DEVNO
  242.         fi
  243.         ;;
  244.     *)
  245.         abort "$(basename $0): $ACTION event not supported"
  246.         ;;
  247. esac
  248.  
  249. exit 0
  250.  
  251.